#pragma once


#ifdef  WIN32
#define  DLLEXPORT		_declspec(dllexport)
#else
#define  DLLEXPORT		__attribute__((visibility("default")))
#endif // 


typedef unsigned char           byte_t;

#ifdef __cplusplus
extern "C" {
#endif

	/*
		public_key : 二进制数组 [0x64, 0x12.....], 公钥
		msg: 二进制数组， 原始数据
		sign: 二进制数组，签名数据
	*/
	/*
		return: 0成功， 其它失败
	*/
DLLEXPORT	int SM2_CheckSign(const byte_t * public_key, int public_key_len, const byte_t * msg, int msg_len, const byte_t * sign, int sign_len);

	/*
		privite_key : 二进制数组 [0x64, 0x12.....]，私钥
		msg: 二进制数组， 原始数据
		id：  证书编号
		sign: 二进制数组，签名数据, 需预先申请内存
	*/
	/*
		return: 0成功， 其它失败
	*/
DLLEXPORT	int SM2_Sign(const byte_t * privite_key, int privite_key_len, const byte_t * msg, int msg_len, const char * id, byte_t * sign, int * sign_len);

	/*
		public_key : 二进制数组 [0x64, 0x12.....], 公钥
		msg: 二进制数组， 原始数据
		sign: 二进制数组，签名数据, 需预先申请内存
	*/
	/*
		return: 0成功， 其它失败
	*/
DLLEXPORT	int SM2_CheckSign_Ex(const byte_t * public_key, int public_key_len, const byte_t * msg, int msg_len, const byte_t * sign, int sign_len);

	/*
		privite_key : 二进制数组 [0x64, 0x12.....], 私钥
		public_key : 二进制数组 [0x64, 0x12.....]，公钥
		msg: 二进制数组， 原始数据
		id：  证书编号
		sign: 二进制数组，签名数据, 需预先申请内存
	*/
	/*
		return: 0成功， 其它失败
	*/
DLLEXPORT	int SM2_Sign_Ex(const byte_t * privite_key, int privite_key_len, const byte_t * public_key, int public_key_len, 
	const byte_t * msg, int msg_len, const char * id, byte_t * sign, int * sign_len);

//************************************
	// Parameter: jsonstr
	/*
	json{
		cmd:    int,   0-- ex签名， 1-- ex验签,		 2-- 签名， 3-- 验签
		base64:		需签名数据(原始数据: byte_t数组)
		privite_key:	私钥, 字符串
		public_key:  公钥, 字符串
		id： 证书编号，字符串
		sign: 验签数据, base64, 原始数据(byte_t数组)
	}
	*/
	//Returns:
	/*
	json{
		Result: 返回结果 0 成功， 其它失败
		ResultStr: 结果描述
		sign: 签名数据，base64, 原始数据(byte_t数组)
	}
	*/
	//************************************
DLLEXPORT const char * SM2_Json(const char * jsonstr);

#ifdef __cplusplus
}
#endif